package com.tao.controller.webpageController;

import com.tao.pojo.dto.PageSelectProductDto;
import com.tao.pojo.dto.ProductDto;
import com.tao.pojo.entity.Product;
import com.tao.result.Result;
import com.tao.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@Slf4j
@RequestMapping("/webPage/product")
@CrossOrigin(origins = "http://localhost:7000/")
public class ProductController {
    @Autowired
    ProductService productService;
    @Autowired
    RedisTemplate redisTemplate;

    @DeleteMapping("/delete")
    public Result deleteProductController(@RequestParam List<Integer> idList) {
        log.info("前端传来的产品id数组为:{}", idList);
        productService.deleteProductService(idList);
        return Result.success();
    }

    //对于!!!经常访问!!!的查询模块，可用redis缓存增加访问速度，增删改同样要进行操作
    //redis属于业务逻辑，为缓存优化，在service操作
    //可测试性 ：将Redis操作放在service层可以使得单元测试更容易进行。可以通过mock service层的方法来隔离和测试controller层的逻辑，而不需要依赖实际的Redis实例。
    //事务处理 ：如果业务逻辑涉及到多个数据源（如数据库和Redis）之间的事务操作，这些逻辑应当放在service层，确保事务的原子性和一致性。
    @GetMapping("/list")
    public Result selectByCategoryIdController(Integer categoryId) {
        List<Product> products = productService.selectByCategoryIdService(categoryId);
        return Result.success(products);
    }

    @PostMapping("/add")
    public Result addProductController(@RequestBody ProductDto productDto) {
        log.info("接收到前端数据:{}", productDto);
        productService.addProductService(productDto);
        return Result.success();
    }

    @GetMapping("/pageSelect")
    public Result pageSelectProductController(PageSelectProductDto pageSelectProductDto) {
        log.info("前端传来的数据：{}", pageSelectProductDto);
        return Result.success(productService.pageSelectProductService(pageSelectProductDto));
    }

    @PutMapping("/updateProduct")
    public Result updateProductController(@RequestBody ProductDto productDto) {
        log.info("前端传来数据：{}", productDto);
        productService.updateProductService(productDto);
        return Result.success();
    }

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        return Result.success(productService.getByIdService(id));
    }

    @PostMapping("/status/{status}")
    public Result updateStatus(@PathVariable Integer status,Integer id) {
        productService.updateStatusService(status,id);
        return Result.success();
    }

    @GetMapping("/remoteSearch")
    public Result selectProduct(String name){
        return Result.success(productService.selectProduct(name));
    }
}
